package com.starmark.sys.login.provider.service;

import com.starmark.sys.login.api.dto.UserInfoDto;
import com.starmark.sys.login.api.dto.UserLoginToken;
import com.starmark.sys.login.api.service.ISysLoginService;
import com.starmark.sys.login.provider.exception.LoginException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;

import java.util.List;
import java.util.Optional;

/**
 * 通过登陆方式获取该登陆方式的实现
 */
@Component
public class SysLoginServiceFactory {

    @Autowired
    private List<ISysLoginService> sysLoginServiceList;

    /**
     * 通过登陆方式获取该登陆方式的实现
     *
     * @param loginType 登陆类型
     * @return 登陆方式实现类
     */
    public Optional<ISysLoginService> getLoginServcie(String loginType) {
       return  sysLoginServiceList.stream().filter(sysLoginService -> sysLoginService.isSupportLogin(loginType)).findFirst();

    }


    /**
     /**
     * 登陆系统
     * @param token 登陆凭证
     * @return 用户信息
     */
    public UserInfoDto login(UserLoginToken token){
       ISysLoginService loginService=this.getLoginServcie(token.getLoginType()).orElse(null);
        Assert.notNull(loginService,"该登陆服务不允许为空");
        UserInfoDto userInfoDto=loginService.loadUserByToken(token);
        Assert.notNull(userInfoDto,"查找人员不存在:"+token.toString());
        if(token.isRequriedPassword()&&!loginService.isPasswordMatch(token,userInfoDto)){
            throw new LoginException("密码验证失败");
        }
        return userInfoDto;

    }
}
